package management.system.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import management.system.model.bean.UsuarioDTO;
import management.system.model.interfaces.UsuarioDAO;
import management.system.utils.MySqlDBConn;

public class MySqlUsuarioDAO implements UsuarioDAO{

	public UsuarioDTO getValidarUsuario(String email, String clave)
			throws SQLException {
		// TODO Auto-generated method stub
		UsuarioDTO dto = null;
		String sql = null;
		sql = "SELECT * FROM usuario where Email_Usuario=? and Clave_Usuario=?;";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setString(1, email);
			pstm.setString(2, clave);
			rs = pstm.executeQuery();
			
			if(rs.next()){
				dto = new UsuarioDTO();
				dto.setUsuarioId(rs.getInt("Usuario_ID"));
				dto.setPerfilId(rs.getInt("Perfil_ID"));
				dto.setNombres(rs.getString("Nombres"));
				dto.setApellidoPaterno(rs.getString("Apellido_Paterno"));
				dto.setApellidoMaterno(rs.getString("Apellido_Materno"));
				dto.setEmail(rs.getString("Email_Usuario"));
				dto.setClave(rs.getString("Clave_Usuario"));
				dto.setSexo(rs.getString("Sexo"));
				dto.setFechaNacimiento(rs.getDate("Fecha_Nacimiento"));
				dto.setCelular(rs.getString("Celular"));
				dto.setDocumentoId(rs.getInt("Documento_ID"));
				dto.setNumeroDocumento(rs.getString("Numero_Documento"));
				dto.setEstado(rs.getString("Estado"));
				dto.setGrupoId(rs.getInt("Grupo_ID"));
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return dto;
	}

	public ArrayList<UsuarioDTO> listUsuarios() throws SQLException {
		// TODO Auto-generated method stub
		UsuarioDTO dto = null;
		ArrayList<UsuarioDTO> lstUsuarios = new ArrayList<UsuarioDTO>();
		String sql = null;
		sql = "SELECT * FROM usuario;";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			rs = pstm.executeQuery();
			
			while(rs.next()){
				dto = new UsuarioDTO();
				dto.setUsuarioId(rs.getInt("Usuario_ID"));
				dto.setPerfilId(rs.getInt("Perfil_ID"));
				dto.setNombres(rs.getString("Nombres"));
				dto.setApellidoPaterno(rs.getString("Apellido_Paterno"));
				dto.setApellidoMaterno(rs.getString("Apellido_Materno"));
				dto.setEmail(rs.getString("Email_Usuario"));
				dto.setClave(rs.getString("Clave_Usuario"));
				dto.setSexo(rs.getString("Sexo"));
				dto.setFechaNacimiento(rs.getDate("Fecha_Nacimiento"));
				dto.setCelular(rs.getString("Celular"));
				dto.setDocumentoId(rs.getInt("Documento_ID"));
				dto.setNumeroDocumento(rs.getString("Numero_Documento"));
				dto.setEstado(rs.getString("Estado"));
				dto.setGrupoId(rs.getInt("Grupo_ID"));
				lstUsuarios.add(dto);
				
			}

		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return lstUsuarios;
	}

	public Integer insertUsuario(UsuarioDTO dto) throws SQLException {
		// TODO Auto-generated method stub
		String sql = null;
		Integer result = null;
		sql = "Insert into Usuario(Perfil_ID, Nombres, Apellido_Paterno, Apellido_Materno, Email_Usuario, "+
				" Clave_Usuario, Sexo, Fecha_Nacimiento, Celular, Documento_ID, Numero_Documento, Estado, Grupo_ID, " +
				" Fecha_Registro, Fecha_Modificacion) " +
				" values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'E', ?, now(), now());";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setInt(1, dto.getPerfilId());
			pstm.setString(2, dto.getNombres());
			pstm.setString(3, dto.getApellidoPaterno());
			pstm.setString(4, dto.getApellidoMaterno());
			pstm.setString(5, dto.getEmail());
			pstm.setString(6, dto.getClave());
			pstm.setString(7, dto.getSexo());
			pstm.setDate(8, dto.getFechaNacimiento());
			pstm.setString(9, dto.getCelular());
			pstm.setInt(10, dto.getDocumentoId());
			pstm.setString(11, dto.getNumeroDocumento());
			pstm.setInt(12, dto.getGrupoId());
			result = pstm.executeUpdate();
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return result;
	}

	public Integer updateUsuario(UsuarioDTO dto) throws SQLException {
		// TODO Auto-generated method stub
		String sql = null;
		Integer result = null;
		sql = "Update Usuario set Nombres=?, Apellido_Paterno=?, Apellido_Materno=?, Email_Usuario=?, " +
			" Clave_Usuario=?, Sexo=?, Fecha_Nacimiento=?, Celular=?, Documento_ID=?, Numero_Documento=?, Grupo_ID=?, " +
			" Fecha_Modificacion=? Where Usuario_ID=? and Perfil_ID=?;";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setString(1, dto.getNombres());
			pstm.setString(2, dto.getApellidoPaterno());
			pstm.setString(3, dto.getApellidoMaterno());
			pstm.setString(4, dto.getEmail());
			pstm.setString(5, dto.getClave());
			pstm.setString(6, dto.getSexo());
			pstm.setDate(7, dto.getFechaNacimiento());
			pstm.setString(8, dto.getCelular());
			pstm.setInt(9, dto.getDocumentoId());
			pstm.setString(10, dto.getNumeroDocumento());
			pstm.setInt(11, dto.getGrupoId());
			pstm.setTimestamp(12, dto.getFechaModificacion());
			pstm.setInt(13, dto.getUsuarioId());
			pstm.setInt(14, dto.getPerfilId());
			result = pstm.executeUpdate();
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return result;
	}

	public UsuarioDTO getUsuarioById(Integer Id) throws SQLException {
		// TODO Auto-generated method stub
		UsuarioDTO dto = null;
		String sql = null;
		sql = "SELECT * FROM usuario where Usuario_ID=?;";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setInt(1, Id);
			rs = pstm.executeQuery();
			
			if(rs.next()){
				dto = new UsuarioDTO();
				dto.setUsuarioId(rs.getInt("Usuario_ID"));
				dto.setPerfilId(rs.getInt("Perfil_ID"));
				dto.setNombres(rs.getString("Nombres"));
				dto.setApellidoPaterno(rs.getString("Apellido_Paterno"));
				dto.setApellidoMaterno(rs.getString("Apellido_Materno"));
				dto.setEmail(rs.getString("Email_Usuario"));
				dto.setClave(rs.getString("Clave_Usuario"));
				dto.setSexo(rs.getString("Sexo"));
				dto.setFechaNacimiento(rs.getDate("Fecha_Nacimiento"));
				dto.setCelular(rs.getString("Celular"));
				dto.setDocumentoId(rs.getInt("Documento_ID"));
				dto.setNumeroDocumento(rs.getString("Numero_Documento"));
				dto.setEstado(rs.getString("Estado"));
				dto.setGrupoId(rs.getInt("Grupo_ID"));
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public Connection getConnection(){
		MySqlDBConn mysql = new MySqlDBConn();
		return mysql.getConnection();
	}

	@Override
	public Integer getEmailUsuario(String email) throws SQLException {
		// TODO Auto-generated method stub
		Integer result = null;
		String sql = null;
		sql = "SELECT count(*) as result FROM usuario where Email_Usuario=?;";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setString(1, email);
			rs = pstm.executeQuery();
			
			if(rs.next()){
				result = rs.getInt("result");
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Integer getNumDocumento(String numero) throws SQLException {
		// TODO Auto-generated method stub
		Integer result = null;
		String sql = null;
		sql = "SELECT count(*) as result FROM usuario where Numero_Documento=?;";
		
		System.out.println("sQL:"+sql);
		Connection conn = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setString(1, numero);
			rs = pstm.executeQuery();
			
			if(rs.next()){
				result = rs.getInt("result");
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}

}
